1 定时执行

  • setTimeout(定时器) clearTimeout
  • setInterval(定时器) clearInterval
  • setImmediate clearImmediate
    • 在本轮事件循环的所有I/O操作之后执行
    • 在下一轮事件循环的所有定时器操作之前执行
  • process.nextTick
    • 在所有Immediate和所有I/O操作之前执行
    • 原子执行,过程不能中断

2 事件循环

  • 每一个事件阶段都有一个 先进先出的回调队列
  • 当事件循环执行到每个阶段,会在允许情况下执行该阶段的所有操作,然后进入下一个阶段
    • 要么执行完所有在队列里面的回调
    • 要么执行完最大的回调个数限制的回调数
  • 事件循环中的每一个回调(操作)完成后,如果有process.nextTick设定的回调,要立即全部执行完(这个看起来是亲生的,相比setImmediate这个后娘养的来说),再进行下一个回调
  • 事件循环的每个阶段及其执行内容
    • timers
      • 执行setTimeoutsetInterval设定的回调;
      • 只能保证不会提前执行,有可能被其他任务拖延(还没轮到这个阶段,设定的时间已经过去)
    • I/O callbacks
      • 执行除timerscheckclose callbacks之外的所有回调
    • idle, prepare
      • 内部使用的阶段
    • poll
      • timers执行也在这里控制
      • 新的I/O事件的处理,此处可能会阻塞
      • 队列非空,执行当前阶段到最大数量限制或者队列置空
      • 队列为空
        • 如果check不为空,执行check中的全部内容;
        • 如果check为空,等待回调添加,然后立即执行
        • 检查timers中到点的回调,并执行times阶段
    • check
      • setImmediate设定的回调(相比起来后娘养的)
      • 在poll完成时执行
    • close callbacks
      • I/O关闭的回调,比如socket.on(‘close’,’…’)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   ┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<─────┤ connections, │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘

3 闲扯淡

NodeJS官方文档比较setImmediateprocess.nextTick

  • process.nextTick在当前阶段立即执行
  • setImmediate在下一轮事件循环的时候尽早执行

如果把tick理解为一次回调的话,就没有那一段说的那个问题了,immediate再快也要等到高优先级的搞完了才到,而tick可以理解为秒针动一次(一个回调) ,一次循环不能为一个tick

4 参考资料

  1. [whatwg event-loop](https://html.spec.whatwg.org/multipage/webappapis.html#event-loope441 W33)
  2. NodeJS 官方Guide
  3. MDN JavaScript EventLoop
  4. 一次弄懂Event Loop(彻底解决此类面试问题)
  5. 从Chrome源码看浏览器的事件机制
  6. 事件循环机制 Event-Loop及其延伸
  7. 【朴灵评注】JavaScript 运行机制详解:再谈Event Loop
  8. JavaScript 运行机制详解:再谈Event Loop
  9. JavaScript 事件循环(译文JavaScript Event Loop)
  10. Nodejs Event Loop
  11. 神之门V8—–Event loop的舞池盛宴(1)
  12. 神之门V8—–Event loop的舞池盛宴(2)
  13. 神之门V8—–Event loop的舞池盛宴(3)
  14. Understanding the Node.js Event Loop
  15. v8 posts
  16. 【翻译】Promises/A+规范
  17. 协程与事件循环
  18. Promise的队列与setTimeout的队列有何关联?
  19. Promise 的队列与 setTimeout 的队列的有何关联?
  20. 理解Promise简单实现的背后原理
  21. 理解 Promise 简单实现的背后原理
  22. Promise介绍–异步篇
  23. 前端基础进阶(十二):深入核心,详解事件循环机制
  24. 深入理解Node.js:核心思想与源码分析
  25. 事件循环
  26. Timer解读
  27. Yield魔法
  28. 从setTimeout说事件循环模型
  29. js: 从setTimeout说事件循环模型

最后更新: 2022年03月02日 03:32

原始链接: http://rawbin-.github.io/browser/2017-05-08-js-event-loop/

× 赞赏这个人~
打赏二维码